Думаю, что оправдано т.к. это единственный "честный" путь выгрузки сборки.
При вызове функции из другого AppDomain используется маршаллинг так, что будут потери в производительности на сериализацию/десериализацию передаваемых/возвращаемых между сборками объектов. Если передаваемых/возвращаемых данных не много тогда не критично. Затраты памяти на дополнительные GC и сами AppDomain думаю не принципиальны.
Недавно была
описана альтернатива, но имхо не стоит так делать.
ЗЫ Если интересует готовый каркас приложения, обращайся.