Only skimmed the discussion here, so I apologize if I’m saying something that hasn’t been said before.
In Rc’s case, the clone() is particularly annoying because Rc can be used in situations where you intentionally want to handwave memory management. Eg because the particular part of the code you’re working in is high-level code where performance issues are going to be much more dramatic than an indirect pointer access or a cache miss, and the Rc clone()s could lead to you missing the forest for the trees. Or a “penny-wise, pound-foolish” style of programming.
The best argument I can think of against it is “that’s not the niche Rust is supposed to occupy, you should use a different language”. But even assuming that’s an option, that means you lose all the expressiveness of the type system and have to re-expose that in the other language.
I unfortunately can’t think of a good solution here. To me, it’s somewhat distinct from Copy and Clone. Lumping a reference count increment in with clone seems like an unfair grouping. It probably isn’t as cheap as a small Copy, but in all but the most tight loops, it’s probably going to be insignificant compared to any other clone(). But beyond the potential backwards compatibility issues, adding another trait seems risking trait pollution.
EDIT: Continued reading a bit more and I so far tenatively like @illicitonion 's solution. This seems like a decent way of labeling a high-level scope as such so that you can tell that any clone()s involved are actually significant and worthy of note. Eg doing syscalls or copying a substantial amount of data.