
Fezile Gcaba put Durban City ahead in the 36th minute at King Zwelithini Stadium, before Thokozani Khumalo struck back with a 59th‑minute equaliser.
City were reduced to ten men as Athini Jodwana picked up a second yellow card for handball with 79 minutes on the clock.
The game went to extra-time where the score remained one apiece before City emerged victorious with goalkeeper Darren Keet making one save before Arrows skipper Ayanda Jiyane smashed his sudden-death kick onto a post.
Arrows had controlled the early possession but were rather static, as opposed to the approach play from City that saw them look to attack with pace when recovering possession.
A more direct approach from the home team came in the form of a deep curling ball from the right-hand side from Siyanda Ndlovu with Junior Dion waiting but City goalkeeper Darren Keet got both hands to the ball.
READ: Nedbank Cup 2026: TS Galaxy defeat Brave Jacksa Spears to advance to semi- finals
Samkelo Maseko Got his head to a great cross from the left on 12 minutes as City threatened for the first time but he only managed to head the ball into the ground for an easy save for Arrows stopper Edward Maova.
Abafana Besthende were showing more purpose with their passing and Keet had to be alert at his near post as a cross-come-shot from Ayabulela Maxwele so nearly snuck over the line, after some good approach play.
Siphosihle Mosomi then made a great weaving run on the left flank and cut inside his man but could only deliver a poor pass as Dion took up a great position on the edge of the box.
Another near-post delivery, this time from Ndlovu, from the right-hand side, was well scooped up by Keet on 34 minutes while a shot on the volley from Sithole lacked any punch to test Keet, a minute later.
But it was the away team to take the lead, against the run of play, with Gcaba firing in from close range on 36 minutes as Arrows failed to clear their lines following a corner.
A soft defensive header was pounced on by Terrence Mashego, who played a superb sweeping pass out to Saziso Magawana on the right flank, and his low cross was met by Gcaba, who took one touch and smashed the ball into the roof of the net.
Ncgaba was in again a moments later, this time as he connected to a cross from the left of the pitch, but he failed to make any real connection.
The second half started with Arrows defender Khulekani Shezi firing over the City goal as they threatened with an early corner.
City could have been two goals to the good after just four second half minutes after a loss in possession allowed Maseko in on goal, but he pulled his shot just past the right-hand upright.
Isaac Cisse had two attempts to reach Dion with crosses from the left-hand side but saw his first effort well defended by Siphamandla Ncanana before blasting his second effort well wide.
Arrows boss Manqoba Mngqithi had seemingly seen enough and introduced Thokozani Khumalo to support Dion in the 57th minute, and he made an immediate impact with a goal barely a minute later with a close-range header from a Maxwele delivery from the right-hand side.
Shezi was all that stopped City from retaking their lead with a last-gasp tackle inside the area to thwart a thrilling passing move with Trevor Mokwena ready to pull the trigger.
There was a triple change for City as Maseko, Brooklyn Poggenpoel and Kyle Jurgens were all withdrawn for Joslin Kamatuka, Thabo Nodada and Emmanuel Jalai.
Mfanavele Mafuleka was well placed to head clear a dangerous cross from Jalai with Magawana ready to pounce, ahead of further changes for both teams, with extra-time looming.
City though were reduced to ten men as Jodwana picked up a second yellow card for handball and was shown his marching orders by the referee.
Arrows wasted a glorious chance to take the lead in the 81st minute as a perfectly placed square pass from Lungelo Nguse was inexplicably skewed wide by Khumalo from the edge of the six-yard area.
Again Arrows really should have won the tie, following a good ball into a dangerous area, but first the ball from Maxwele bypassed everyone in the City area, before Nguse hit his effort straight at Keet from close range.
Mabaso, meanwhile, fired over in the second minute of first-half injury time as Theron had a shot from 20 yards out blocked as Arrows came forward with wave after wave of attacks.
Cisse hit the woodwork and Keet made a fingertip save, but ultimately neither side was able to find a winning goal and had to settle for the lottery of penalties.
First up was City, and Nodada fired his spot-kick into the bottom left-hand corner of Maova’s net. Maxwele then beat Keet with his kick into the bottom left-hand corner, before Mahlangu side-footed his effort into the right of the goal.
Mabaso levelled the score with his converted effort to the left of goal, as Jalai put his kick away with a calm finish to the left of Maova.
Nguse curled his effort into the bottom right corner, and Ronaldo Maarman powered his shot home, with the Arrows keeper getting a touch to the ball.
Khumalo then failed to beat Keet with his penalty but Jurgens was unable to win the game for City as his kick well saved by Maova.
Cisse stepped up and kept Arrows’ hopes alive with a slow roll into the bottom left-hand corner to take the tie to sudden death.
Mkhize slotted his kick but Arrows were finally beaten when captain Jiyane fired his sudden death kick into the left-hand post.
City will join Casric Stars, Milford FC and TS Galaxy in the draw for the semi-finals on Monday night.