As you yourself said, each occurs at a different time and has different information (as well as a different level of abstraction) and hence can do different things well.
It’s like asking why a camera system has so many components: lenses, sensors, image synthesis from sensor readings, compression, maybe even post-processing like inference and reconstruction tasks.
I’m not going to go into specifics here, because you didn’t ask a very specific question. Loads have been written on what macros are (and aren’t) good for (e.g. domain-specific syntax), on what generated functions are good for (e.g. low-level type-based high-performance code generation), what dispatch is good for (e.g. solving the expression problem), the cases where you want runtime eval (e.g. interactive coding), and so on.
(As we’ve often commented to you, extremely broad and unfocused topics are discouraged here because they usually lead to uninformative, time-wasting threads.)