If you take each of the subqueries and then try to JOIN them, it should work. I added a third field to help you see the detail of how the score was created.
SELECT username, AVG(average) AS average
, GROUP_CONCAT(CONCAT('Course: ', teachers.course_id,' with score ', COALESCE(average,'No Score Found'))) AS detail
FROM (
SELECT mdl_course.id AS course_id, mdl_user.username AS username
FROM mdl_course
INNER JOIN mdl_context ON mdl_context.instanceid = mdl_course.id
INNER JOIN mdl_role_assignments ON mdl_context.id = mdl_role_assignments.contextid
INNER JOIN mdl_role ON mdl_role.id = mdl_role_assignments.roleid
INNER JOIN mdl_user ON mdl_user.id = mdl_role_assignments.userid
WHERE mdl_role.id = 3 ) AS teachers
LEFT JOIN (
SELECT mdl_feedback.course AS course_id, AVG(mdl_feedback_value.value) as average
FROM mdl_feedback_value
INNER JOIN mdl_feedback_item ON mdl_feedback_value.item = mdl_feedback_item.id
INNER JOIN mdl_feedback ON mdl_feedback.id = mdl_feedback_item.feedback
INNER JOIN mdl_feedback_completed ON mdl_feedback.id = mdl_feedback_completed.feedback
INNER JOIN mdl_user ON mdl_feedback_completed.userid = mdl_user.id
GROUP BY mdl_feedback.course) AS scores
ON teachers.course_id = scores.course_id
GROUP BY username