A few additional observations.
1) If you decide to remove from manager, you should know that this clears the entire Query Cache (not just the queries associated with the fetched type). That means that the PM no longer remembers that it queried anything. Subsequent queries go to database until the Q-cache is built back up.
This is essential practice because removing from manager invalidates at least one query and it is near impossible to guess which other queries are affected. You removed a Company; that invalidates all Company queries but also Order queries because you might have queried for orders of a Company. And so on.
There is an overload of the remove in which you tell the PM not to clear the Q-cache [Pm.RemoveEntities(IEnumerable, bool)]. You can manipulate the Q-cache directly too. These techniques are for special cases wherein you can be certain that no query is adversely affected by such removal or Q-cache manipulation. You cannot be certain in the scenario presented so I strong recommend that you do not use these techniques.
2) I'm surprised you found such a large footprint. I'd like to see the case when you have time.
3) Many customers anticipate problems with cache memory ... that never in fact arrive. As always with performance tuning, it helps to measure, measure, measure.
4) The separate PM approach is the best and easiest for large collections of read-only data. For example, you might have a UI in which the user roots around in a huge Product Catalog. The user is profoundly unclear about what he wants and so retrieves an enormous number of products before settling on the three items he really wants.
The catalog search UI relies upon a "Catalog PM" within the search UI. The floundering user's queries fill out this pm, not the Main Pm. You will ultimately discard the Catalog PM (or clear it).
This technique works fine for selecting data or even modifying that data while it resides in the Catalog PM.
Just remember to copy the selected/modified items from the Catalog PM to the Main PM before purging the Catalog PM; this copy is a simple, one-line statement.
BTW, the search UI can assess the size of the Catalog PM and flush it only when it hits some max (after the user leaves the search module of course).
Observe that the Main PM's Q-cache is unaffected by these operations.
5) I'm not sure it was clear: it is easy to clear the entity cache of an entire type; you don't have to do anything fancy with any queries; see PM.RemoveEntities(Type, DataRowState).