Async programs are doing lazy evaluation, so they are better at discovering of critical path of execution. It's similar to out of order execution of instructions in CPU, but on a higher level.
In theory, a compiler can (should) rearrange order of execution for non-async programs also.