In that case, there is nothing that prevents f(x) from being evaluated every time regardless of whether the cache has an entry or not. or_insert() just discards the value you pass if there is already an entry. It does not and cannot control evaluation of the expression f(x), whereas or_insert_with() can decide not to call the || f(x) closure you pass, and f(x) is only evaluated if the closure is called.
Switching to a Copy bound does nothing but make your function applicable to fewer types. Everything that implements Copy also implements Clone, so if you can write your function with Clone then you should.