Please read also this excerpt (from the same link: http://www.postgresql.org/docs/9.3/static/sql-insert.html)
If the INSERT command contains a RETURNING clause, the result will be similar to that of a SELECT statement containing the columns and values defined in the RETURNING list, computed over the row(s) inserted by the command.
Yes, I know that this description may be confusing :)
In easy words: returning clause works similar to SELECT, which retrieves rows from the table, combines them into a resultset, and sends this resultset directly to the client (the client = gui tool, java/c++ programm etc.). The client must know how to read this resultset (open it, retrieve rows, values etc. from it), using some API - for example in java there is JDBC api for processing resultsets--> look for ResultSet
class.
So, returning clause creates a resultset and sent it to the client - in the same way as ordinary SELECT does.
Return statement in the function terminates that function and returns the value of expression to the caller.
Not directly to the client, but to the caller - to the other function/procedure or SELECT statement which called this function. And doesn't returns the resultset (a set of rows), but the value.