Ezequiel,
também creio que "depende", mas discordo do que diz.
Para o banco, teoricamente chaves primárias compostas, normalização, etc são melhores, dependendo da modelagem, mas isso só se torna uma vantagem em uns poucos casos, já que na maioria das vezes a normalização com chaves compostas acaba obrigando a criação de várias FKs e vários índices, e acaba neutralizando a vantagem.
A operação de JOIN sobre uma FK e na ordem correta é muito leve, com quase nenhum impacto. Ela se torna pesada quando usada sem uma FK ou na ordem incorreta, e a diferença é na casa de centenas de vezes mais peso.
Há situações onde uma SELECT de múltiplas tabelas também é mais vantagem do que usar JOIN, desde que seguindo a mesma regra usada com JOIN.
E outra coisa: a JOIN é tão leve, que dependendo do seu filtro, é mais rápido criar uma tabela temporária, popular essa tabela com os valores e usar JOIN sobre ela do que usar um BETWEEN, IN ou um conjunto de OR.
Exemplo:
select * from tabela where data between ('2010-06-02', '2010-07-02'); --- lento
select * from tabela join tabela_temporaria on tabela.data = tabela_temporaria.data; --- rapido