Halford struck early in the eighth minute with Forest’s first goal in four matches to sink the lowly Lions.
Andy Reid swung in a corner from the right and the defender was unmarked as he powered in a header from eight yards.
With Millwall on the back foot Radoslaw Majewski tried his luck from 20 yards and was denied by David Forde at full stretch, before Billy Sharp just failed to force the ball over the line following a goalmouth scramble.
Millwall began to find their feet as the first half wore on and they could have had a penalty when Shaun Batt raced through and went down under Elliott Ward’s challenge, but referee Kevin Wright ignored the appeals.
James Henry then lobbed inches over an open goal after Karl Darlow had gone walkabout, and the Lions winger also crashed an angled drive into the side-netting.
After the interval the hard-working Batt was fouled on the edge of the area, but Darlow held Henry’s curling free-kick.
Batt almost got his head on to Henry’s right-wing cross but was denied by a fine interception by Danny Collins, before a handball appeal against Halford in the box was also waved away.
Forest could have doubled their lead when Reid’s curler beat Forde, but not defender Adam Smith on the goal-line.
Forde did better with 10 minutes left with a fine reaction save to deny Marcus Tudgay from point-blank range.
Millwall boss Kenny Jackett threw on strikers John Marquis and Andy Keogh in a bid to snatch a point, but it was defender Karleigh Osborne who came closest to an equaliser with a downward header which flew wide.
However, Millwall have struggled for goals ever since they let last season’s top scorer Darius Henderson leave in January – to Forest – and the visitors held out to take the play-off race to the final week of the season.