I'm currently hacking on a toy webserver in Haskell, and from my point of view, I spin off a thread for each request, but Haskell's runtime environment manages all of these as a group of green threads doing aynch IO behind the scenes. Best of both worlds as far as I'm concerned.
I just change
serve request
to forkIO (serve request)
And magically I have multithreaded aynch IO that seems to be extremely performant.