Я думаю, вы должны использовать оба подхода.
При разработке «библиотечного» кода , например, в виде «инфраструктурных» классов и других объектов, которые можно использовать повторно (например, собственные компоненты ZF, компоненты Doctrine 2 и т. Д.), Вы можете поместить их в каталог библиотеки. (или свой собственный совершенно отдельный проект)
При разработке реальных модулей ZF (как, например, модуль auth), затем отформатируйте код вокруг структуры модуля ZF.
Я думаю, что с помощью такого подхода вы получите все преимущества, которые вы перечислили, и почти ни одного из минусов:)
В качестве еще одной идеи, если вы разрабатываете свои части архитектуры как «сервисы», вы можете даже поддерживать их в качестве собственных конечных точек веб-сервисов.