Because in practice, the 20 async calls are never actually made in parallel. The site makes one call, waits for it to finish, downloads a few more scripts, makes another call, parses the results of that call using an accidentally-quadratic-time algorithm, sends a bunch of tracking events over WebSockets and waits for them to finish, makes another call, uses that call to trigger a full-page React/Redux re-render, schedules another call in an asynchronous render effect handler...