In my work job, I use C for embedded work, and there I use macros a lot.
Some reasons are legacy (migrated to a compiler that could do C99/static inline pretty late), some not. In the past we used 20-33MIPS/16-bit and even less (8-bit, 8MIPS) CPUs, while new prints now are for 32-bit 200MHZ/MIPS parts.
Most macros are basically pin aliases in the board definition, so that firmwares can migrate to later boards which might shuffle pins.
Some others are as aliases for peripherals (which are basically register names), which you could see as a kind of generic. The peripheral register names are created with some ## magic.
If I would start new, I probably would go to a more arduino level with a bit more runtime overhead. But most firmwares are relative small in absolute size (20-30kb) and lines (5000 lines main C file is already much, with maybe some more in libraries)
I do sometimes wonder how I would handle this in Pascal (go with the more arduino like option, or use an extra macro processor?).
I also have about 100kline C++ code. That is not embedded, so I don't really use macros there.