Most products benefit from a well-modularized monolith: clear domains, thin controllers, and explicit service classes. Premature microservices multiply deploy complexity and distributed debugging.
When a subsystem has independent scaling needs or a team boundary, extract it and define an API contract. Until then, packages and modules inside the app often suffice.
Measure coupling with real traffic and error budgets; let metrics justify the network hop.