Most of the technical debt and issues that large programs ultimately face comes from doing just what you propose. Letting teams implement their own solutions.
But inevitably what you end up which are a dozen similar and dissimilar approaches to the same problem. Some functional, some less so. You end up with different UIs that don't adapt in the same way and that don't behave in the same way.
You end up with code bloat and with team members who have problems transitioning between teams because team A does the same exact thing differently from team B.
If your teams have communication issues then focus on the communication issues. Don't punt and say "Screw it. Y'all do what you want."