R
What operations will you do with the data? Especially the altitude?
If it is just extra info, simply have another column, altitude, of type FLOAT or DOUBLE, depending on the precision needed.
If you are computing distances in 3D or trying to do 3D "CONTAINS", then MySQL's SPATIAL won't help.
"... order of coordinates ..." -- You must handle this as you store the info.
Is JSON really needed? It gets in the way of many operations. If you don't need a Spatial index, then simply have 3 Float or Double columns.
"... storing each point individually ..." -- Again, what will you do with the points? If the only 'entity' you have is a 'point', the 3 columns, one row per point seems right. If multiple 'points' are defining a 'polygon', that is another matter.
One altitude per polygon
A single row per polygon -- one GEOMETRY column for the polygon, one FLOAT for altitude.
Each point has a different altitude
Now it gets messy. Is "CONTAINS" referring to the projection of the polygon on the surface (of the earth or a plane)? Or something else? You might need two tables -- one table with one row for each polygon stored as a GEOMETRY; the other table has one point per row, perhaps as 3 FLOATs.