There is no conversion cost by type.
The various types are intended solely to express the design as clearly as possible - not only to other readers (or to you, next year :-), but to the compiler, allowing him to catch as many errors as possible (for example, this integer value is out of range)
Type conversions are your way of telling the compiler "yes, I wanted to do this."
Use the type that best reflects the intent of the project.
If you use too many type conversions, this usually means that something has been declared as the wrong type; stop and think about the design a little, and it will often be simplified beautifully. If you want to increase std_logic_vector, it probably should be unsigned or even natural.
Then convert when you need: often on top-level ports or other IP people.
Conversions can endlessly slow down modeling, but that's another matter.
As for your option 2: detailed descriptions at a low level are not only harder to understand than a <= a + 1; , but synthesizer tools are easier to carry and most likely contain errors.
source share