When is metaprogramming the best solution?

Julia has all these fancy metaprogramming features but when is it actually most optimal or comfortable to use them?
Follow up question: Is it ever worth it use metaprogramming in a complicated way?

Mandatory link:


I am a user of macros, but have never written any. @chain and @benchmark are my most common encounters with metaprogramming. @turbo and @tullio are other good examples.