Ug! Your dilemma is so familiar. We ended up with a solution akin to the one Diane described above.
Our Labor object is backed by time reporting data from Clarity (if you're familiar with that tool) which also contains the cost center of the employee contributing the time. (we don't create unique cost centers for projects, we have cost centers for Labor).
Our Labor data is linked to our IT Resource Towers via Cost Center relationship. So we simply added a text suffix of "-project" to the Cost Center in our Master Labor dataset. We also created a duplicate transform of our IT Resource Towers Stage that included the "-project" suffix for each row, and then appended that new stage transform to the IT Resource Towers Master dataset. The result is that we can link the -project info in Labor with the -project info in the IT Resource Towers data.
Our -project costs then flow out of the IT Resource Towers object into a "Projects" that also contains the -project suffix and then ultimately flow to the Business Services and Business Units.
When we create a report to expose costs, it is possible for us to use only IT Resource Towers and Business Services.
We can easily identify which Tower and Subtower the costs originate from, and we can further differentiate whether the cost is "-project" versus "-blank" (i.e. not project based cost).
This may not fit your scenario exactly, but I can certainly relate to the challenge of trying to work around the 3 object limitation.
Hopefully this will spawn some ideas for you.