This is a very interesting question! :) I think your existing arguments show you are considering many of the important points here.
Perhaps another angle is why not avoid mocking altogether and just use real objects?
For developers that substitute for a logical interface (rather than for a specific object implementation that has not been developed yet) then I think they will prefer not to replace with an actual implementation, as there is not a single implementation to replace. (Another way to think about this is that the substitute is already an additional implementation of that interface. Mocking libraries are a short cut for manually writing this implementation.).
Test doubles are not just about placeholders for pending development though. They also let us do things like reliably test conditions that would be intermittent with real objects. For example, testing how a class reacts when the service it is calling is down, or overloaded, or returns an error code, etc. In these cases it is generally not feasible to replace with a production object.
If you have not seen it already you may want to look into Contract Tests as described here:
https://martinfowler.com/bliki/ContractTest.html (the term is a bit overloaded I think, so be mindful of that while googling :) ). That seems a mix of both options: keeping test doubles, but ensuring they stay in sync with reality.
Also possibly related to this question is the London vs. Chicago/Detroit schools of TDD, which emphasise interaction testing (generally lots of test doubles) and state based testing respectively. This, along with general top-down vs. bottom-up development styles, could also influence peoples answer to this question. (See [1], [2], [3])
Hope this helps :)
Regards,
David