I've been using the equivalents of Godot's _draw() for years, it's rather effective. My thought is, if I procedurally develop my assets at run time (I've never done it on Godot, but it's a simple enough task), and constrain the result to make a reasonable amount of sense, then all I would technically need is a random seed for it. The game could generate the field of play at run time.
Of course, that does gobble some processor time and expand the memory footprint quite a bit; but to my knowledge there's no rule against that.