More threads on a single core equal more context switches, which reduces the effective amount of instructions you can process.
And setting up, say, one thread per HTTP request will likely be negligible because blocking I/O is where time is spent anyways..
And we have had non-blocking I/O for quite some time now.
Your I/O should only be done synchronously if it's non-blocking.
Now for disk I/O, it's a more muddy thing, it's actually quite different from networking since it's more transparently managed by the operating system.