My vote is for instead teaching the compiler to treat declare-function
more like it treats defvar, in that the effect of declare-function
should be made local to the current lexical scope. [It is already
possible to write this way, and I've been known to, but sadly the effect
is global.] This wish has been raised and agreed on here (at least in
passing) before.
This would reap all the benefits of points 1-4, as well as an additional
one: that declare-function is lexically closer to the implementation
through which the need for the declaration arises. I think a
declaration at the top of a function is more likely to be forgotten and
become stale as the implementation changes.