Eu prefiro fazer um branch para toda modificação que precisar de mais de 1 dia para ser realizada. Manutenções rotineiras (com testes rotineiros) estão sempre no trunk.
O que ocorre é que às vezes temos que fazer modificações grandes, mas os clientes ou nossos sites, muitas vezes não podem esperar a gente terminar para corrigir um bug, por exemplo. Agora, uma coisa legal a fazer é usar o git e o git-svn, já que usamos o SVN e não o CVS. Isso porque podemos fazer todas as alterações na nossa máquina, versionando aos poucos, e commitar no SVN apenas quando estiver tudo pronto. Isso diminui os problemas de merge que sempre ocorrem. Mas isso, dependendo do número de pessoas no projeto e estabilidade do núcleo do mesmo, só funciona para 1 ou 2 dias. Depois, fica tão chato quanto o merge.
Agora, vou falar algo que corro o risco de levar pedra, mas é isso aí. Das últimas vezes que fizemos um upgrade de versão, criamos a nova versão no trunk. E abrimos um branch para a versão atual, que por já estar estável, sofre menos alterações. Fizemos isso porque o merge é sempre a coisa mais chata do mundo de ser feito. Não é muito “ortodoxo”, mas tem seus benefícios. O principal é que os desenvolvedores sempre sabem que a evolução está no trunk.
Opiniões?