Zamalek will face first division side Bany Sweif, who surprisingly knocked out Ghazl Mahalla, in the competition's round of 16.
Gaafar, who rediscovered his best form in recent matches, opened the score line after just eight minutes when he chested Tarek Al-Sayed's cross at the far post before hitting a right-footed shot into the top corner of the net.
Zamalek could have easily doubled the lead on several occasions but lacked the cutting edge in front of goal.
Youssef Hamdi's deft pass beat the offside trap and released Gaafar, who went on one-on-one situation but the keeper blocked his shot.
Gaafar wasted another opportunity shortly afterwards as he went face-to-face with the keeper again but a smart interception from a Police Union defender denied his effort.
Striker Hossam Osama, who made the starting line-up due to the absence of Amr Zaki and Abdul-Halim Ali, almost added the second but his close-range header was tipped by the keeper.
It was no difference in the second-period as Zamalek continued their domination but failed in their attempts to extend the score.
Police Union played with ten men in the last ten minutes after Mohamed Hanafi was sent-off for a second bookable offense.