так, давай по мере поступления вопросов
1. правильно, но не совсем. логика работы с дом может так же располагаться в compile, зависит от задачи.
2-3. почему в контроллере лучше держать логику ( в разрезе директивы )? самый важный момент - в контроллер можно прокинуть сервисы и там работать с ними. в контроллере доступен $scope (так же как и в функции link). В контроллере ты не можешь ( не уверен, т.к. не пробовал ) работать с контроллером директивы ngModel (валидация, парсеры и форматеры), но ты можешь сформировать пак данных, с которыми будут работать эти (вышеперечисленные) объекты в функции link.
4. не вижу смысла в таком подходе, т.к. получается, что ты 2-й раз инитишь контроллер (через new). и я не совсем уверен, что контроллер можно использовать как Класс, для создания инстансов. у него механика работы отлична от angular.module().service()
upd
самый большой плюс всего этого действия - удобство тестирования.
отдельный контроллер проще тестировать
действия над дом проще тестировать, когда они не перемешаны с логикой контроллера
код получается тестируемый и поддерживаемый