How can we make more complicated custom shapes using openGL (ie. mountains, face, etc) without having to specify the vertices of each polygon by hand?
Define “by hand?” Those vertices are going to have to be specified by somebody. This is true whether you’re doing it in C/C++ code as static data, or loading it from some form of model file, or generating it with an algorithm.
The general practice for models of significant size is to use a modeling application to create a model, export it to some format, and then load that format in your actual application. Some developers may pre-process the exported data to optimize it and/or translate it to formats that their tools can use.