I'm thankfully young enough to have never had to deal with this, but I've seen old drawings. I'm sure there were other methods, but the complex surfaces I've seen had to have a lot of dimensioned points and/or datum targets. Shops would then interpolate smoothly between those points in their G-code. It definitely limited how complex a part you could design and still expect tight tolerances, but they still designed some incredible parts back then.
I worked on dive mask and helmets >30yrs ago... we had a sculptor sculpt the different sizes (our master models (male/female) or configurations) based off our 2D drawings (multiple cross sections).. and/also verified the shape/sections using tools such as a pantograph.
The Pantograph was also used to create/interpolate the tooling paths (g code) for the machines. Soft molds are created to verify and this goes through multiple iterations. For the final, the data from the panto of the profile data is updated and/or referenced in our drawings. (that is, what you think you are drawing in 2D is not aways what you get.. so you need to update the drawing to reflect the final release)