My opinion is, you might need to specifically consider each object. If you've decided that the objects are as you listed above, then the separate filters I think you need to consider are:
1) filter on portfolio ID
2) filter on project portfolio ID
3) filter on task's project portfolio ID
4) filter on issue's project portfolio ID
I hope/think that's everything, but of course it's your job to test the hypothesis.
The first 2 are the "easy filters", as they are available with the standard reporting mode. So you should be able to create filter 1 (portfolio ID = XYZ) and filter 2 (project portfolio ID = XYZ). Separate these two filters with an "OR".
The last 2 you might need to use exists statements. You would/should read up on exists statements here:
https://experienceleague.adobe.com/en/docs/workfront/using/reporting/reports/text-mode/create-comple...
Some sample code might look like this:
EXISTS:a:$$OBJCODE=TASK
EXISTS:a:ID=FIELD:taskID
EXISTS:a:project:portfolioID=XYZ
EXISTS:a:project:portfolioID_Mod=in
EXISTS:b:$$OBJCODE=OPTASK
EXISTS:b:ID=FIELD:taskID
EXISTS:b:project:portfolioID=XYZ
EXISTS:b:project:portfolioID_Mod=in
You would prepend them all with your "OR:" number. Assuming you already have the first two lined up, you should be looking at a clump that looks like this:
portfolioID=XYZ
portfolioID_Mod=in
OR:1:project:portfolioID=XYZ
OR:1:project:portfolioID_Mod=in
OR:2:EXISTS:a:$$OBJCODE=TASK
OR:2:EXISTS:a:ID=FIELD:taskID
OR:2:EXISTS:a:project:portfolioID=XYZ
OR:2:EXISTS:a:project:portfolioID_Mod=in
OR:3:EXISTS:b:$$OBJCODE=OPTASK
OR:3:EXISTS:b:ID=FIELD:taskID
OR:3:EXISTS:b:project:portfolioID=XYZ
OR:3:EXISTS:b:project:portfolioID_Mod=in
Please note, I do not test my sample code, it's just provided as a suggestion.