The problem with async programming, or cooperative multitasking (as it was popularized in the Windows 3.1 era) is that the CPU is a resource too. Threads are a better way of slicing up CPU time.
The other way is that sometimes a little more load perturbs the system so things take a lot longer. I've had systems that work fine until you hit X% cpu, then it jumps to 90%+, because of say lock contention; sometimes N is 80% so whatevs, but sometimes it's 25%, and then you need to find and fix the bottleneck.
E.g. pool of 10 threads does computational heavy task requests and responds when done to the async i/o bound task.