When one should use template specialization, if not for metaprogramming?
A coisa "clássica", e até mesmo aquela que você menciona no final, é refinar uma determinada implementação genérica para um tipo específico (conjunto de).
O exemplo principal aqui seria "otimizações" de contêiner ou algoritmo para tipos triviais. (Veja, por exemplo, std :: copy )
Não há nada meta sobre isso até onde eu posso dizer: para alguns tipos, uma determinada versão especializada será objetivamente melhor, mantendo todos os requisitos da versão genérica, então ela será implementada assim que for necessário.