There's a lot of superstition and opinion surrounding !important dating back a long time.
As with any tool:
So having said that, there is a reason !important exists - sometimes you need it as a last resort to have your style overpower other styles. Sometimes this is because of bad CSS you can't change, or HTML you can't change (often when trying to override plugins or embeds). The reason it exists is because sometimes the alternative - getting the same effect done without using !important leads to even uglier code than the 'code smell' of using !important, like using long, complex selectors to bulk up your specificity.
When should you use !important? When every other tool in the toolbox of CSS has failed you and what you need to be able to do is severely ramp up the importance of a particular value for a property.
When should you avoid using !important? If you haven't tried:
Once you've used it on a few projects you'll get a better understanding why it's so useful and often so excessive and why people are so cautious about using it — but the best way to understand all of these things isn't to avoid it, but to try using it yourself and see what happens. Experiment. And try to learn how to override a property with !important (Hint: it involves a more specific selector).
I hope my comment and the other comments here can shed some light on this unloved part of CSS <3