Adjectives and adverbs describing the cost or quality of an item in English can have positive or negative connotations, depending on the context. In German however, the words on this topic tend to be a bit more defined. In most contexts, the adjective/adverb billig has negative connotations, such as when a wife finds out her ex-Stasi* agent husband is having an illicit affair with a woman he once interrogated:
Das ist so billig.
That is so cheap.Play Caption
On a more positive note, you can use the adjective/adverb preiswert:
Sie können bei uns Getränke umsonst haben und noch preiswert fliegen.
With us they can have drinks for free and still fly inexpensively.
Captions 32-33, Fluglinien - Niki AirPlay Caption
And on an even more positive note, the adjective/adverb günstig:
Er hat sich ein günstiges Gerät gekauft,
He bought himself an inexpensive device,
Caption 15, Flipperautomaten - Kunstwerke für flinke KugelnPlay Caption
Auch aufgrund der Mietpreise, die hier sehr günstig sind.
Also because of the rent prices, which are very reasonable here.
Caption 20, Jonathan Johnson - Kreuzberg, BerlinPlay Caption
Die Gerichte sind günstig.
The meals are reasonably priced.
Caption 12, Universität - KarlsruhePlay Caption
Günstig may also be translated as "affordable" or "low-priced" or even "cheap," but it's important to remember here that it's usually meant positively, and never to indicate that something was of poor quality like the word billig. Günstig also has quite a different meaning in other contexts:
Das Wetter ist hier sehr günstig, es ist einfach schön.
The weather here is very favorable, it's simply nice.
Caption 22, Konstantin - ein Freiwilliger in Israel - Part 1Play Caption
It's pretty unlikely that weather would be described as "cheap." In this sense, günstig may also be used to describe situations that are fortunate, beneficial, providential, auspicious or merely convenient. A very favorable word indeed!
To conclude: billig is usually "cheap" in a negative sense, preiswert is "inexpensive" in a more positive sense, and günstig is "reasonable" in the most positive sense. Günstig also has additional positive meanings. Go to Yabla German to find more examples of all three words used in a real world context and see if you can find some other German words that can also mean "cheap" or "inexpensive."
*Stasi is an acronym for der Staatssicherheitsdienst, the secret police in the former German Democratic Republic.