Until every function is async.

Except nobody writes code like that. It would be horrible.

Sync functions perform better than async functions, and they give more guarantees to the caller. They're strictly better, when you can use them.

If you find yourself making everything async, your design is bad and you should refactoring your code.

If a function is not pure, it very likely has to be async.

Which just brings you back to preemptive multithreading, but without being able to use all the cores you paid for.