Apache is full of gotchas as stated. For one, the event MPM is not async :p
It's still creating multiple processes that get recycled periodically, each with a fixed number of threads. Every active request holds a thread.
Apache quickly runs into troubles when having long lived requests (slow API calls or large file downloads) or when using websockets (hold a thread permanently).
The tuning to balance processes, threads, connections, requests and resource consumption is extremely complicated and it doesn't get very far.
HAProxy and nginx can both handle 10k concurrent connections out of the box. Apache requires extensive tuning before 1k.