Some people think that async code phrased as though it was blocking code is easier to read, write, and modify. This is because the workflow for writing async code with callbacks is basically
1. Imagine the control flow you actually want.
2. Manually perform some subset of a CPS transform around the parts that would block.
3. Write the result of 2 and check it in.
And then the workflow for updating it is
a. Read the code.
b. Attempt to reconstruct a mental model of the originally-desired control flow from the mess.
c. goto 1.
If you have some simulation/game in which many entities need to interact, you can use coroutines and write each entity's routine(s) imperatively. For example, BulletML lets you do this by embedding a suspendable domain-specific language in your project. If you check out http://www.youtube.com/watch?v=uK_YTyhj7T4, every bullet that either fires other bullets or changes velocity has one or more functions attached to it, and they are all running concurrently. It might be even better to do this without using an extra language, though.