In some cases (e.g. elements that trigger JS events but aren't real links or buttons) an I-beam may appear. In these cases cursor: pointer; is quite beneficial, though cursor: default; (not the same as "auto") may be appropriate.
But the web != your OS. Many things that work and are expected on the desktop, such as double-clicking, right-clicking, and dragging, are considerably more rare online, where there are a different set of expectations and, as you mention, affordances.
Yes, but buttons are buttons wherever they are, and browsers even style them according to the OS theme. That's why I think they should be treated as buttons and not hyperlinks.
And the sad thing is that desktop applications are starting to do this too. The new Symantec Antivirus interface is all webby and slow (something else I don't like), and uses the hand for buttons. This makes me a sad panda.
The difference is that "cursor: pointer" means (by default) that the target will initiate navigation away from the current page. All other elements follow OS conventions as a matter of presenting a common UI grammar to the user.
In my (unresearched) opinion, cursor:pointer was created to indicate that a hyperlink can be clicked on. Buttons were obvious, but underlined words in the middle of a paragraph, not so much.
It irritates me when people learn a concept and then illogically apply it to other domains. That's why I'm making a fuss, it seems like everybody is not using their brains and saying "EVERYTHING you click must use the hand because links do!".
So then would you say it is fair to use "cursor: pointer" on buttons that initiate navigation away from the current page? For instance: form submit buttons?
You don't 'click on' a button, you 'click' or 'push' it. It's a button. There's no need to change the cursor to let you know that you can actually click on it. That's the reason hyperlinks use the hand.
I hate that no matter what it's called. For God's sake, don't use the hyperlink cursor for buttons!