The visitors took an 18th-minute lead when a Jed Wallace free-kick rebounded off the wall and into the path of Ryan Leonard, whose low drive from outside the box was deflected past Dan Bentley by Bradshaw.
The visitors made it 2-0 in the 68th minute when City midfielder Han-Noah Massengo was robbed and the resulting counter-attack ended with Bennett curling in an exquisite right-footed shot from the left corner of the box.
The hosts had a night to forget, struggling to mount meaningful attacks from first whistle to last. Their misery was complete when substitute Famara Diedhiou was sent off for a high boot, his second booking in the space of six minutes.
Both managers made changes after challenging their teams to bounce back from poor performances.
It was Bodvarsson who headed wide from the first chance of the game. But soon the first half developed into a scrappy affair with neither side able to create much.
Bradshaw opened the scoring 18 minutes into the game and that briefly sparked City into life, with Nahki Wells almost equalising with a free-kick from the corner of the box which nearly caught out Bartosz Bialkowski, who dived to save one-handed at the near post.
Millwall should have doubled their advantage in the 29th minute as a Bradshaw cross found its way to the far post where Bennett lifted his shot over when unmarked.
City were struggling to put any meaningful passes together against well-drilled and committed opponents desperate to end their recent poor run.
Millwall looked comfortable as the home side appeared content to play square passes without any semblance of penetration.
Bennett made it 2-0 22 minutes before the end, with his goal summing up City's lacklustre display as Massengo was robbed far too easily.
It took a brave Bentley save near the end to prevent the impressive Wallace making it 3-0, a scoreline that would not have flattered Rowett's team.
Substitute Matt Smith also forced a Bentley save and the home side looked grateful to hear the final whistle.