Mhm. I like the idea of function supersession. Basically, I just don't think we should call a function deprecated unless it actually is indeed deprecated, i.e., no longer used anywhere in the core. Theoretically, a function that is deprecated in the core should not show any warnings whatsoever when testing without extensions.
+1. Things should be deprecated, or not deprecated.
If something is deprecated, it should not be used whatsoever in core or extensions (that are in the Wikimedia repo). It should be the person adding the wfDeprecated()'s responsibility to ensure that there are no uses in core or extensions.
I am not a fan of hidden "Deprecated in some future version" thingies. If there is something wrong enough with the code to deprecate it, it should be deprecated immediatly. I do think its ok to occasionally have "It's ok to use this function in old code, but new code should use other function x", but such code should at most have an @deprecated on it. It shouldn't generate warnings until such a time as it is no longer used anywhere in core.
If something deprecated is still used in core, it is perhaps a sign that whatever is replacing the deprecated function isn't a sufficient replacement.
-- -Bawolff