Apparently you misunderstand all three of the original blog post, the actor model, and erlang's specific implementation.
Composition of actors in the actor model is done by message proxying, just like this blog post does. The original actor's API is preserved and undergoes no semantic change, just like composition in any other functional concurrency paradigm.
This works in erlang where it wouldn't work in most other languages because actors are very lightweight and message passing is a fast, optimized language primitive.
Having written many hundreds of promises and awaits, and many thousands of actors, I'd have to say that the actor paradigm is far easier to scale and reason about than any promise or async/await implementation. That's partly because almost every other language is pretty terrible at concurrency. But your mileage may vary and everyone has their preferences.