Acredito que a maioria das pessoas que desenvolveram qualquer aplicativo de banco de dados do mundo real de tamanho significativo dirá que as chaves substitutas são a única solução realista.
Sei que a comunidade acadêmica discordará, mas essa é a diferença entre pureza teórica e praticidade .
Qualquer consulta de tamanho razoável que precise fazer junções entre tabelas que usam chaves não substitutas em que algumas tabelas têm chaves primárias compostas rapidamente se torna insustentável.