In Mythical Man Month, packaging is identified as an early sin. Tiers are part of packaging.
You have designed your system well. Your components have nice interface boundaries, and each component could be deployed upon a different computer, with a different architecture, in a different location, and your system would work just fine. If you followed this far enough, many of these components could be deployed not just remotely, but also redundantly and concurrently to permit greater scalability and resiliency.
The micro-service architecture actually demands this. Your system needs to decompose into in(ter)?dependent services that can be deployed outside your layer of control to permit scaling, etc. A modern version of JCL(*) is employed in ugly named things like k8s and faas to grant scaling and redundancy to your system.
Regardless of these clever configuration mechanisms; some basics from traditional systems theory reign. For example, if two modules inordinately communicate/share, they need to be relatively co-located. The JCL needs to be able to express this, and the assertions of the component linkage becomes a definition of the tiers.
(*)Job Control Language; a rightly maligned mechanism used by IBM to allocate and deploy resources on mainframes in the 1970-2014; when it was suddenly replaced by an even harder to understand set of json & yaml files under the banner of k8s. Those that don't learn from the past are doomed to repeat it; badly.