Yes — with Lambda in front of S3, I’d change the design.
I would do the _label_data → submission.data matching in Lambda, not in Athena. In your sample, the matching rule is: container keys become path prefixes like part-a-your-details.*, the concession select stores its answer under .submission.data["part-d-which-concession-did-you-and-any-person"].value, and Part E stores radio codes like e6-1 that must be translated through the matching component’s values[].value -> values[].label list. The sample also has repeated labels like “First name”, so keeping section_label and field_label_path is useful. 
That means the best lake layout is: 1. Keep the original payload in a raw/ prefix for audit/replay. 2. Write a second normalized answers dataset where each row is one answered field: • submission_id • form_id, form_machine_name, form_title • field_path, field_key, field_type