I think it depends on what you are doing. If the app has a single logical thread of execution, then sequential code is easier to understand than a series of callbacks. If the app executes steps in parallel with forks and joins, then a state machine implemented with callbacks can be easier to understand.
The typical web app falls in to the former category: validate input, read from cache, maybe read from database, maybe write to database, generate response.