Ways to store data

Fields

When you create a content type and add fields, you are using the Field API.  Behind the scenes, Drupal converts what you specify in the UI into database tables to store your node data.

Fields are attached to entities.

If  you are building a feature locally that you will deploy to a site, it can be difficult to use Fields.  For example, if you create a custom block type to use on your homepage, it's quite difficult to have the block auto populate with default values, and get placed in the right region upon deployment.

Config

Config is exported to files.  This means that when you change a config value, it becomes overridden, and may get reverted on the next deployment if the change is not captured to code.

State

State replaces the Variable system from D7.  However, it says it's intended for temporary values, like last cron run.  I have used this to store the fields of a footer block, which I didn't want to save as config.

KeyValue

https://api.drupal.org/api/drupal/namespace/Drupal%21Core%21KeyValueSto…

This is not really documented.  I'm unsure how it differs from State.

http://www.jpstacey.info/blog/2016-11-28/drupal-8-api-state

Hardcoded

If you need some text to use in a template, it's very fast to just hardcode it.  This may make it hard for content editors to change down the line, but is usually a quick update for developers.