In most situations the storage variable is going to be used in many more places throughout the contract's code. The function argument may show up in a few places, but in most cases it won't be as prevalent as the storage variable.
It is this developer's opinion that it is nicer to work with greeter than _greeter. In my code the function argument gets the underscore prefix since I work with it in fewer locations. This leaves the rest of my code free to use a normal variable rather than one that is prefixed.
A less opinionated reason would be that for public variables, using an underscore prefixed name would also mean that the getter function would have the same name. This results in a contract ABI in which some of the functions have underscore prefixes which may be confusing to users.