I'm more concerned about the memory impact.If this is possible and not too complex, it's good. I was coming with something a lot more complex. I just assumed promotions couldn't be altered to receive specific property outside their effects.
Units have an array of all promotions in the game and whether they have them or not.
This would require adding a second array of all promotions specifying if they were obtained for free or not, or at least a second flag to the 'whether they have them or not' part.