Yes, the over-conceptualized abstractions can be annoying. However if you read the RFCs that specify the patterns, http://rfc.zeromq.org/spec:28, http://rfc.zeromq.org/spec:29, http://rfc.zeromq.org/spec:30, and http://rfc.zeromq.org/spec:31, you will see that each pattern encapsulates more than just the routing model.
When you send() you also need to express how exceptions are handled -- what happens when there are no peers, and what happens when their buffers overflow.
Martin Sustrik did a fine job when he designed those patterns because they are (so far) watertight containers for rather tricky semantics.