I understand your frustration, but what you are asking isn't possible with the present charging structure.
If giffgaff had only one user, it would be possible to start their goodybag at exactly midnight.
If giffgaff had two users, one of them would have to start a fraction before midnight because they are processed sequentially.
But giffgaff has tens of thousands of users that need recurring goodybags updated every day. That's why processing them has to start several hours before midnight. Currently that's 7.30pm.
The alternative would be to start processing them at midnight, but that would mean that some users would be without a goodybag until 4.30am the next day. If they used data between midnight and the time their replacement goodybag actually starts, then that data would be charged 5p/Mb at PAYG rates -- and that would be substantially worse than the goodybag starting a few hours early.
The problem could possibly be solved in several ways, but the present method is probably the best that can be achieved with the limitations of the present software.