How do I preserve changes to a theme’s functions.php across updates?

Yes. Can’t say it any clearer. @s_ha_dum already said it in fact. Creating a Child Theme allows for almost any customisation to a theme, customisation that won’t be lost when updating a (parent) theme. The WordPress Codex entry for Child Themes takes you through the whys and wherefors.
It’s extremely simple to create a Child Theme (see link to codex). In fact, you only need a stylesheet that imports the Parent theme stylesheet.

Once you have your Child theme in place, look through your site (and brain) to work out where you placed/made any customisations (you mention functions.php but did you create any custom templates for example? Or perhaps you edited ones in the Parent theme?). You’ll need to copy these changes into your child theme folder e.g. a new functions.php, styles.css or template-i-modified.php.