Lisp macros are runtime code generation. This is not runtime code generation, it's code generated at some arbitrary time by the author, it's not even build-time code generation. This feature has a completely different use-case than Lisp macros, the comparison is completely unwarranted.
Lisp macros are not really 'runtime' code generation. There is a reason one might say that it is, but that's because a full Lisp is available during compilation.
In a typical Common Lisp project, Lisp macros generate the code at compile time. Since a full Common Lisp is available at compile time, this looks similar to runtime, but it isn't. For that the macro itself and the code it needs to run needs to be available during compilation.
During development the compile-time and runtime code often run inside the same Lisp system. But that's a certain style of development and not necessary. It's also possible that the generated code will form an application, which then runs outside of the compile environment.
To take a typical data structure declaration and to generate compile-time code for it is quite typical. What Lisp typically not do is to dump the generate code as source to a file, but to feed the generated code to the compiler and then create compiled code.