В то же время ни Order, ни Payment не могут работать без Cart
То есть у вас возникает циклическая зависимость Order и Cart? я так понимаю?
Вообще Order, Cart и Payment можно объеденить в один модуль, который задает базовые интерфейсы + тыща модулей с реализацией интерфейсов. Типа CardPayment и т.д. Словом нужно избавляться от циклических зависимостей и думать о кейсах когда с чем будет работать. Скажем Cart без Order не имеет смысла, а вот Order без Payment - имеет.
Или же тема оформления не поддерживает нужный модуль.
Хорошая идея - тема должна содержать метаданные о том какие модули оно поддерживает а какие нет. + идея с виджетами.
Возможно ли это? Если не полная, то хотя бы слабая зависимость модулей друг от друга?
Более чем, просто придется дробить систему не на такие вот модули а на отдельные компоненты, во всю использовать принципы единой ответственности, сегрегации интерфейсов и инверсии зависимостей.... короче убьете вы много времени но это возможно.
Стоит ли оно того?
Увы вы один не сможете написать и поддерживать такую систему. Многие пытались и даже есть парочка неплохих вариантов (
sylius.org например ), но в одиночку за приемлимое время - маловероятно.
Какие есть пути уменьшения зависимости модулей друг от друга?
Доменные события это к слову неплохой вариант уменьшения связанности, можно рассматривать как вариант. Но в целом должно хватать соблюдение принципов SOLID и более рациональное дробление функционала, поиск общих зависимостей и тд. Сегрегация интерфейсов + Инверсия зависимостей.