<p>What is the practical benefit of using HTTP GET, PUT, DELETE, POST, HEAD? Why not focus on their behavioral benefits (safety and idempotency), forgetting their names, and use GET, PUT or POST depending on which behavior we want?</p>

<p><strong>Why shouldn't we only use GET, PUT and POST (and drop HEAD, DELETE)?</strong></p>

The [REST][1] approach uses POST, GET, PUT and DELETE to implement the CRUD rules for a web resource.  It's a simple and tidy way to expose objects to requests on the web.  It's web services without the overheads.
Just to clarify the semantic differences.  Each operation is rather different.  The point is to have nice HTTP methods that have clear, distinct meanings.
POST creates new objects.  The URI has no key; it accepts a message body that defines the object.  SQL Insert.  [
Edit
While there's no technical reason for POST to have no key, the REST folks suggest strongly that for POST to have distinct meaning as CREATE, it should not have a key.]
GET retrieves existing objects. The URI
may
have a key, depends on whether you are doing singleton GET or list GET.  SQL Select
PUT updates an existing object.  The URI has a key; It accepts a message body that updates an object.  SQL Update.
DELETE deletes an existing object.  The URI has a key.  SQL Delete.
Can you update a record with POST instead of PUT?  Not without introducing some ambiguity.  Verbs should have unambiguous effects.  Further, POST URI's have no key, where PUT must have a key.
When I POST, I expect a 201 CREATED.  If I don't get that, something's wrong.  Similarly, when I PUT, I expect a 200 OK.  If I don't get that, something's wrong.
I suppose you could insist on some ambiguity where POST does either POST or PUT.  The URI has to be different; also the associated message could be different.  Generally, the REST folks take their cue from SQL where INSERT and UPDATE are different verbs.
You could make the case that UPDATE should insert if the record doesn't exist or update if the record does exist.  However, it's simpler if UPDATE means UPDATE and failure to update means something's wrong.  A secret fall-back to INSERT makes the operation ambiguous.
If you're not building a RESTful interface, then it's typical to only use GET and POST for retrieve and create/update. It's common to have URI differences or message content differences to distinguish between POST and PUT when a person is clicking submit on a form.   It, however, isn't very clean because your code has to determine if you're in the POST=create case or POST=update case.