As a bit of a follow-up to #14363 I think the deprecation of rpc functionality can be improved significantly.
One of the big problems with the way it is now, is that it's often undesirable to update client-software and bitcoin-core at the same time. Especially so when they're often maintained by different people/groups.
The deprecatedrpc is in a way a pretty intrusive way of just making sure the node operator knows that deprecated functionality is being used. I would suggest that this is generally the wrong "party" to be notifying anyway.
My suggestion is that in addition the rpc-client is the one that acknowledges it's using deprecated functionality. I'm not sure exactly how the implementation should work. But it could be done either connection-wide (an rpc-call to say which deprecated functionality it's using?), or as a flag to that specific call (acknowledge_deprecated=true).
Now as a bitcoin-client-software-author this makes a much smoother work flow. Let's say core 0.17 comes out and deprecates signrawtransaction in favor of signrawtransactionwithwallet. I can immediately update my software to acknowledge signrawtransaction is deprecated. Now it's immediately compatible with both 0.16 and 0.17. Once enough of my users (or my only user in a more corporate setting) has fully upgraded to 0.17 and I no longer care about supporting 0.16, I can simply replace the call with the new signrawtransactionwithwallet.
A change like this should be pretty uninvasive, and significantly make upgrades smoother for software using the rpc functionality.