You could use the gtable
package for flexible and convenient grid layouts, or simply nest two arrangeGrobs,
ng = nullGrob()
grid.arrange(arrangeGrob(p1, p2, p3, nrow=1),
arrangeGrob(ng, p4, p5, ng, nrow=1, widths=c(0.5, 1, 1, 0.5)),
nrow=2)
Edit: For the bottom plots to span the full width, you simply need to remove the dummy nullGrobs() in the above solution:
grid.arrange(arrangeGrob(p1, p2, p3, nrow=1),
arrangeGrob(p4, p5, nrow=1),
nrow=2)