The victory keeps Pirates firmly in second place with 36 points from 15 matches, while City remain stuck in 10th with 21 points from 18 games, both trailing runaway leaders Mamelodi Sundowns, who boast 45 points from 17 outings.
The first half saw Pirates dominate possession with 72% of the ball and pepper City's goal with 11 attempts, but they found themselves trailing at the break.
City struck first in the 21st minute through Haashim Domingo, who calmly slotted home after a slick one-two between Kayden Francis and Prins Tjiueza carved Pirates open. Tjiueza's cutback was inch-perfect, and Domingo made no mistake from close range, silencing the buoyant home crowd.
Pirates' wastefulness was evident early on. Relebohile Mofokeng and Thalente Mbatha both tested City keeper Darren Keet inside the opening five minutes, only to see their efforts saved.
Patrick Maswanganyi, a constant menace, fired just over the bar on multiple occasions, while Deon Hotto's long-range free kick sailed narrowly high. Despite their control, Pirates couldn't find the net, and City's clinical edge gave them the halftime lead.
The second half brought renewed vigor from the hosts. Substitutions injected fresh legs, and Pirates' persistence paid off in the 67th minute. Tshegofatso Mabasa levelled the score, latching onto a pinpoint low cross from substitute Mohau Nkota.
With momentum swinging, Pirates pushed for the winner. Their pressure told in the 87th minute when Goodman Mosele, another substitute, struck the decisive blow. A corner wasn't fully cleared, and after Mofokeng forced a sprawling save from Keet, the ball fell to Mosele, who smashed it home from point-blank range.
City fought back late, with Tjiueza rattling the side netting in the 90th minute, but Pirates held firm.
The hosts finished with 70% possession and 24 goal attempts to City's six, underscoring their dominance. Keet's heroics kept the scoreline respectable, but City couldn't muster a response after Mosele's late dagger.
For Pirates, this win reinforces their title-chasing credentials, though Sundowns remain the team to catch. City, meanwhile, rue a missed opportunity to climb the table, their early promise undone by Pirates' second-half surge.
The Orlando faithful left buzzing, and on this evidence, the Buccaneers are in no mood to let their season drift away.
Match Stats: Possession: Pirates 70% - City 30% Shots: Pirates 24 - City 6 Yellow Cards: Pirates 3 (Shandu, Sibisi, Xoki) - City 3 (Petrus, Francis, Gordinho)