Both are viable options, and it really comes down to your game and it's complexity.
With option one, you as the designer have full control over everything you do, however you also end up having to do all of the work in a repetitive and tedious manner. This is probably the safest way to work, but if you have a background in programming, you can create a better way.
With option two, you can have a "Factory" class, it could be a single factory that generates everything, or you could have a separate factory for each object type you need to spawn. You can hold a reference to each prefab you need to spawn in these factories, and simply use Instantiate() to generate your enemies, players, etc. The problem with this approach is your code needs to know where to place these, otherwise it will end up defaulting their spawn point to the origin, and that can get a little predictable.
To counter this, you can easily make a little Editor tool to place spawn points around a level, and programatically select a spawn point for each Instantiation you perform. It sounds like a long way around, but over the course of your entire game production, it could save you a lot of time.
As for your last question, creating GameObjects from scratch, it is possible. Here's a quick example.
// Create the gameobject
GameObject newObject = new GameObject();
// Add the required components
// Set it's position in the world
newObject.transform.position = new Vector3(50, 1, 50);
Obviously you could do a lot more with it, but I would probably recommend cloning prefabs with Instantiate, as writing a tonne of code to make what is essentially a prefab every time is a bit of a waste. On the flip side, if you are randomizing the abilities of enemies on the fly before spawning them, then this way could be a great option to take.