Boil down a lot of complexity... into even more even more complex code. Metaprogramming is usually only simpler for the developer who wrote it.
I love Ruby metaprogramming, don't get me wrong, but using it in production requires diligence with test coverage, and clear and well documented interfaces so non-Ruby experts can still contribute code.
Sure, but there's way less of it. Way less to test, way less to maintain.
Also, you can refactor metaprogramming back out of a codebase after you've introduced it. Basically this involves taking the hacks and giving them classes with state. Essentially you're modifying the design of your application without ever introducing a break in continuity of functionality.
I love Ruby metaprogramming, don't get me wrong, but using it in production requires diligence with test coverage, and clear and well documented interfaces so non-Ruby experts can still contribute code.