You can do a cross service join in a single request. Combine that with good caching and a normalized architecture is (almost) as performant as a demoralized one.
Check out https://github.com/facebook/dataloader
We use it to do cross service joins in the form of bulk requests in a very transparent way.