Ambos tienen sus usos. Primero, algo de historia ...
$ scope es la técnica "clásica", mientras que "controller as" es mucho más reciente (a partir de la versión 1.2.0 oficialmente, aunque apareció en versiones preliminares inestables antes de esto).
Ambos funcionan perfectamente bien y la única respuesta incorrecta es mezclarlos en la misma aplicación sin una razón explícita. Francamente, mezclarlos funcionará, pero solo aumentará la confusión. Así que elige uno y rueda con él. Lo más importante es ser consistente.
¿Cúal? Eso depende de ti. Hay muchos más ejemplos de $ alcance, pero "controlador como" también está ganando fuerza. ¿Es uno mejor que el otro? Eso es debatible. Entonces, ¿cómo eliges?
Comodidad
Prefiero el "controlador como" porque me gusta ocultar el $ alcance y exponer a los miembros del controlador a la vista a través de un objeto intermediario. Al configurar esto. *, Puedo exponer justo lo que quiero exponer del controlador a la vista. También puede hacer eso con $ scope, solo prefiero usar JavaScript estándar para esto. De hecho, lo codifico así:
var vm = this;
vm.title = 'some title';
vm.saveData = function(){ ... } ;
return vm;
Esto me parece más limpio y hace que sea más fácil ver lo que se expone a la vista. Observe que nombro la variable que devuelvo "vm", que significa viewmodel. Esa es solo mi convención.
Con $ scope puedo hacer lo mismo, así que no estoy agregando o quitando valor con la técnica.
$scope.title = 'some title';
$scope.saveData = function() { ... };
Entonces depende de ti allí.
Inyección
Con $ scope necesito inyectar $ scope en el controlador. No tengo que hacer esto con el controlador como, a menos que lo necesite por alguna otra razón (como $ broadcast o relojes, aunque trato de evitar los relojes en el controlador).
ACTUALIZACIÓN
Escribí esta publicación sobre las 2 opciones:
http://www.johnpapa.net/do-you-like-your-angular-controllers-with-or-without-sugar/