Database triggers are bad when they are used when other features are more appropriate.
Features which should be considered before attempting to use triggers:
Check constraints
Foreign key constraints
Unique indexes/constraints
(Persisted) computed columns
(Indexed) Views (if a trigger is attempting something like updating an aggregate, say)
Stored procedures (if direct table access can be prohibited)
After that point, triggers can be appropriately used without being "bad". Triggers should always be designed to have a small footprint.