@hs101s this is possible but takes a lot more preparation than it should. My example here uses the classic designer as it is easier to show the steps.
This is my form with 5 questions:

The overall flow looks like this and there is a branch for each question and I've put the actions for each question inside a scope so that you can more easily copy the scope for each question then adjust, rather than having to create each branch action individually.

The first part of the flow is as follows:

Then add a Scope and inside it add the following Compose actions. Then add a condition with in this case Response3 is equal to CorrectAnswer3

In the green if yes channel add an increment variable action and add 1 to the varScore variable initialized above. In the red if no channel add an append to array variable action with the outputs of Question3:

Copy the scope and add it in for each question changing the question, correct answer, response conditions etc.
Outside all the scope add a new step, a CVompose with the following expression to get the percentage score:
mul(div(variables('varScore'), 5),100)

Then add a condition of the outputs of Percent is less than 80. Leave the red if no channel empty. In the green if yes channel add a join from the varIncorrect and a jojn with <br> so each incorrect answer will be on a separate line in the email.
Finally add the Send an email action with the outputs of the Percent compose and the outputs of the Join Incorrect Answers.

In my test 2 questions were answered incorrectly and this is the email.

Hope that helps, but if you have a lot of questions it will be a lot of work.
Rob
Los Gallardos
Principal Consultant, SharePoint, Forms and Power Platform, WSP Global (and classic 1967 Morris Traveller driver)