What's the best way to allow a user to save variables/options
Yes, instead of content entities you can use config entities. But for only a few configuration options this is too much effort. In this case you can use the Simple Configuration API, either by creating your own form
https://www.drupal.org/docs/drupal-apis/configuration-api/working-with-configuration-forms
or by adding form values to existing admin forms in a form alter hook.
See for example how the core dblog module adds an option to /admin/config/development/logging when it is enabled:
/**
 * Implements hook_form_FORM_ID_alter() for system_logging_settings().
 */
function dblog_form_system_logging_settings_alter(&amp;$form, FormStateInterface $form_state) {
  $row_limits = [100, 1000, 10000, 100000, 1000000];
  $form['dblog_row_limit'] = [
    '#type' =&gt; 'select',
    '#title' =&gt; t('Database log messages to keep'),
    '#default_value' =&gt; \Drupal::configFactory()-&gt;getEditable('dblog.settings')-&gt;get('row_limit'),
    '#options' =&gt; [0 =&gt; t('All')] + array_combine($row_limits, $row_limits),
    '#description' =&gt; t('The maximum number of messages to keep in the database log. Requires a &lt;a href=&quot;:cron&quot;&gt;cron maintenance task&lt;/a&gt;.', [':cron' =&gt; Url::fromRoute('system.status')-&gt;toString()]),
  ];

  $form['#submit'][] = 'dblog_logging_settings_submit';
}

/**
 * Form submission handler for system_logging_settings().
 *
 * @see dblog_form_system_logging_settings_alter()
 */
function dblog_logging_settings_submit($form, FormStateInterface $form_state) {
  \Drupal::configFactory()-&gt;getEditable('dblog.settings')-&gt;set('row_limit', $form_state-&gt;getValue('dblog_row_limit'))-&gt;save();
}