grid.arrange() directly draws on our device.
However, arrangeGrob doesn't draw anything but returns a grob g, which can be passed to ggsave(file="something.pdf", g).
# draw your plots
p1 <- ggplot(...) # first plot
p2 <- ggplot(...) # second plot
p3 <- ggplot(...) # third plot
#merge all plots within one grid
grid.arrange(p1, p2, p3, nrow=3) #arranges plots within grid
#save
g <- arrangeGrob(p1, p2, p3, nrow=3) #generates g
ggsave(file="something.pdf", g) #saves g