The configuration model in Apigee allows a many-to-many relationship between ProxyEndpoints and TargetEndpoints in a single API Proxy. Allows, but does not require. The Proxy in Apigee is a unit of abstraction that allows you to connect to multiple distinct, even disparate, upstream target endpoints. The RouteRules in the proxyendpoint are designed to support that.
When would you use multiple targetendpoints in a single API Proxy? One clear case is to produce a single facade API that groups together operations from multiple distinct systems, in a way that makes sense for an API Program manager, and for a consuming developer. For example, you might have an off-the-shelf CRM along with a custom bespoke order processing system. Producing a single API that wraps both of them might be a good case to use a single API proxy with multiple targetendpoints. On the other hand, in an environment where systems are newer and all built in the same era- where there is effective homogeneity in the upstream - you wouldn’t need disparate targetendpoints because all the targets would be reachable from the same endpoint.
Even if you have a homogeneous backend , in which all exposed APIs are available from a single (maybe virtualized) endpoint, you STILL may want to allow for multiple targetendpoints if your expectation is that homogeneity in the upstream will not persist, either because of mergers/acquisition, or acquisition and use of new tools or off-the-shelf systems. Some companies might want to build everything, others might want to assemble tools and custom-built things into a cohesive unit.
In general, the best practice is to use the power of that configuration model in such a way as it is maintainable and operable by the API program team, or the API publisher, given the environment you are operating in.
There are of course other related issues to consider - will you expose a single API proxy as an API product? In Apigee, again there is a many-to-many relationship possible between proxy and product. But in many cases, API program managers don’t need that generality and exploiting it might lead to more complexity. So they adopt a convention in which each API proxy is exposed as a single API product.
There is also a many-to-many relationship possible between app credential and API product. So even if an App requires multiple related APIs you could issue one set of credentials that are usable across all of them.
In short, do what makes sense for your organization and what you believe will be the most maintainable over the long term. Avoid complexity, eg routerules and multiple targets, until it makes less sense to do so.