One solution to this problem is a method called penalized likelihood. In PL, parameters are allowed to vary in the model, but there is a penalty for dramatic changes in parameter values. For example, one might want to vary the rate of evolution across a phylogenetic tree, but give a penalty when parameter values change a lot between adjacent branches. This is the basic idea of PL in the r8s program.
Kim and Sanderson have now implemented this approach as a way to build phylogenetic trees. This could be very useful; as the authors mention, various other phylogenetic reconstruction methods can be viewed as special cases of penalized likelihood, which can thus cover ground in the spaces between existing methods. This seems promising to me, I'm excited to try it on my own data.
The picture, brought to my attention by Brian O'Meara, is from Sanderson's lab page. I think I need that for my own lab.