In addition to Jesse's great answer, the one item that I would add to his list is technical debt. Every line of code costs you as an organization, to maintain and update. The advantage of workflow is that much of the technical debt of automation (not all, you still have to build and maintain the workflow rules) is assumed by salesforce.com and the platform.
A corner edge case also worth mentioning is that workflow rules that fire a field update and triggers do not play as well together as they should. Field updates can cause strange behaviors on an object with a trigger, often causing a trigger to fire recursively (at least one additional time) in a transaction. The other interplay between field updates and triggers that is problematic is when you need to tightly control the order of execution, like wanting a field value updated before running triggers.