Queues (especially fault tolerant and persistent queues) allow communication between components and ultimately allow queue writers to be asynchronous to readers. This means that readers and writers can be scaled up depending on queue utilisation.
Consider the simple example of servicing web requests. If a heavy operation is pushed onto the queue another set of components can read the queue and handle the request without the writer being impacted and thus allow the HTTP listener to service more requests as it's not tied up. As the number of items in the queue increases more readers can be brought on line to handle them.
In terms of reliability if the queue is reliable then messages between components are not lost, thus communication is inherently more reliable. The readers and writers may go up and down but as long as the messages are safe, then you have the basis for a more reliable system than one where messages can be lost.
In effect you're create a systems with lower run time coupling, and thus failure at one point doesn't necessarily propagate system wide. Allowing fault tolerance strategies to be employed more successfully.