Previously done a few sports titles, we normally export a data file (txt or csv) from our DCC tools with a list of transforms for all the seats then use that to place billboards/actual 3d models with occupancy levels for random placement. Foliage and Paticle systems work pretty well of this if you use a Render Texture for the bill boards. Its always an interesting balance for performance.
The exporting the transforms is the most accurate way we’ve found as normally stadiums have non contiguous areas of seating and steps between columns etc. Another way is to create polygon areas where you want seats and use vertex maps to determine where croud is allowed to be but once again, just random placing can be hard to get the right amount of rows/columns and the odd patterns they are laid out in.