The most important advantage of using fields, rather than custom data in a custom table, is that your data has immediate integration with the rest of the system; including (but in no way limited to):
- Automatic integration with Views
- Potential to use
- Fields can be managed using the standard system UI, even if built in code
- Automatic integration with Features
- There are many contributed widgets that can enhance the UI of a field (e.g. the Term Reference Tree widget
- No need to load your custom data onto the node/entity in a load hook, the core field system does that for you
- No need to define CRUD operations for your data
I'm sure there are many, many more.
Basically, if you want fine-grained control over the operation/performance of your extra data then use a custom table. If you want the system to handle all of that for you, use a field. For what it's worth I pretty much always use a field to store any entity data these days.