With Rust zero cost futures, only one memory allocation is done for the entire chain of futures. It's not doing an allocation for every callback.
This makes it comparable to using a stack. In an M:N solution, the stack is usually (but not always) allocated similarly (e.g. using malloc).