How to speed up a query with a lot of subqueries
I guess that using subqueries inside functions is the main performance problem. 

It seems that the functions are fairly simple and you could drop them and easily rewrite the query with joins only:

SELECT 
  loan.loan_number,
  loan.borrower_name,
  ...
  CASE WHEN loan.date_waiver_ordered IS NULL 
         THEN 'Not Ordered'
       WHEN  MAX(doc.upload_date) &gt;= loan.date_waiver_verified
         THEN 'Not Verified Since Last Upload'
       WHEN  MAX(doc.upload_date) &lt; loan.date_waiver_verified
         THEN 'Verified'
       ELSE NULL
  END  AS get_waiver_status,
  ...

FROM loans_table AS loan

  LEFT JOIN documents_table AS doc             --- joining
    ON  doc.loan_number = loan.loan_number 
    AND doc.document_type = 'waiver' 

WHERE loan.loan_type IN ('A', 'B', 'C')
  AND loan.filing_date &gt;= TO_DATE('30-OCT-12')
  AND loan.filing_date &lt;  TO_DATE('13-NOV-12')

GROUP BY
    loan.PK,                                   --- the Primary Key and
    loan.loan_type,                            --- all the other needed columns
    loan.filing_date,
    loan.loan_number,
    loan.borrower_name,
    loan.date_waiver_verified ;