Doing multiple threads per core is not "proper multithreading", since it's a well-known antipattern.
Why is it an anti pattern, this is news to me?
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.
Userland threads (or fibers, or stackful coroutines) do scale better though.