Two ways you can choose:
You could add a hidden field to the form:
- name: hidden_email
type: hidden
default: 'grav.user.email'
and edit the default hidden field to interpret the Twig, because by default it does not do that.
So in your theme add a templates/forms/fields/hidden/hidden.html.twig with
{% set value = (value is null ? evaluate(field.default) : value) %}
<input data-grav-field="hidden" data-grav-disabled="false" type="hidden" class="input" name="{{ (scope ~ field.name)|fieldName }}" value="{{ value|join(', ') }}" />
What's changed from the default hidden field is the evaluate() call on top, on the default value.
Of course this is not 100% ideal as a user could edit the HTML prior to sending the form.
Another way is to provide a process action for the form.
For example, the Form plugin uses these lines to save the form content and provide the save action. You can write your own plugin to provide an alternative action for the form.
You can check for example how the Email plugin adds its email processing to the form and use the same procedure.