I'm not sure if this is off-topic either, but as it's in a worthy cause, here goes.
Sincerity is the key. There are so many different contexts where you can pay a compliment (to a superior/inferior, to close family or distant acquaintances) that it's not possible to give a single answer, but you have to use words you are comfortable with. Don't say "I greatly admire the insight and perseverance you have shown in the work you have produced here" if your normal mode of speech is "Wow, like, that's really cool", and vice versa.
user978, you say you're often limited to a single adjective - what's wrong with that, if it's sincere? "Cool" and an approving nod can go a long way.
You also say you're good at insults - try turning the insult on yourself, to contrast with the other person ("It would have taken me hours to do that / I'm such a _, I never thought of doing it that way")
If you genuinely admire or appreciate something it shouldn't be too difficult to express it. It becomes more difficult when you DON'T admire something but you want to give encouragement. In these case you admire/appreciate the effort rather than the end result.
For example, a child presents a squiggly drawing and tells you it's a horse. Of course it looks nothing like a horse, but it's easy to encourage the child with a few positive words.
It's harder with adults, eg if your girlfriend cooks a meal which is a disaster. Don't lie and say "Mmm delicious". Acknowledge the disappointment, appreciate the effort, in whatever words you're comfortable with.
Ultimately, actions can speak louder than words (definitely off-topic for a language site). If you think your girlfriend's really special she'll know it by how you behave, not any clumsy compliments. Buy your dad a beer and your mum some flowers.