> callback-based async seems to have become the standard

At some level it's always callbacks. Then people build frameworks on top of these so programmers can pretend they're not dealing with callbacks.