The home side took the lead in the 14th minute when they capitalised on a mistake in the Utrecht defence and Lars Veldwijk's shot was blocked into the path of Wouter Marinus, who put his effort into the bottom corner.
However, the visitors fought back to equalise as they hit Zwolle on the break and Haller found the bottom corner with a low drive from inside the penalty area.
Utrecht went close just before the break when Timo Letschert rose highest in the box to latch on to a corner from the right, but he headed his effort just past the post.
Zwolle threatened when Sheraldo Becker raided down the flank and lifted a cross into the box for the head of Veldwijk, but his effort was straight at Ruiter.
PEC had one final chance to win the game when they were awarded a penalty in the dying minutes when Marc van der Maarel brought down Veldwijk in the box, which resulted in the defender being dismissed.
However, Stefan Nijland lost his composure as he sent the spot kick over the bar. The midfielder was to pay for his miss as there was time for one more twist in the tale.
The visitors were awarded a spot kick in the second minute of stoppage time and Haller took the penalty and fired his effort past Kevin Begois to earn his side the victory.