In addition to the other answers which have very good points, maintainability is also worth noting.
While technically it goes up a bit further, for simplicity sake I'll say that all content types at one point down the chain inherit their properties from Item. What this means is you can technically change anything about the Item content type and have it inherit down to the child content types. I accidentally renamed the Title field on the Item content type once and suddenly all lists had their Title field renamed. It was an interesting accident that confused many users.
A custom list, by default, will have a list instance content type that just inherits from Item (or document in the case of document libraries). That is why when you turn on management of content types in a list, the content type is called Item. You can then modify this content type to your heart's content without affecting the parent Item content type because technically it's a child of the Item content type at this point. You will generally get to a point where you like what you've got and if you want to reuse it you create a list template and use the template to give other sites the same functionality.
Now what happens when the business rules change and all these lists need new fields, different field names, fields that once held numeric values now need to be text values, or anything like that? If you had a custom content type that your lists were all utilizing you could go to that content type in the gallery, modify it, and have all content types on the site collection inherit the changes. If you used the default item content type that comes with a custom list then your parent content type is Item which most likely won't help you at all with the changes you need to make. Instead you will have to individually go to each list and manually make the change or automate it with programming if you have the ability.
Now I'll say that this is not 100% fool proof and still requires planning and maybe a little research, depending on the changes you want to make, so that you don't do something unexpected when you modify your content types. It can still save you a lot of work if you have lots of users utilizing the same prebuilt components - which is why I assume you are using a list definition instead of just manually building the list in the UI since that would save you a lot of time.
Like I said, the other answers are great and definitely cover a larger spectrum of why content types are great, but I feel this is a feature that really stands out that makes it worth mentioning.