it doesn't seem like the Results of the Class Method are coming back correctly 100% of the time.

This is VERY strange, I would add a test/check if an error occur testing SQLCODE and %msg after &SQL() to see if/when/why it fails.

When using embedded SQL you are not supposed to check/access a returned variable (ExtDisplay in your case) before checking for success/failure via SQLCODE variable.

If you need to check if the query found a row, you should check the SQLCODE value, not ExtDisplay  value.

Stream compression is enabled by default since version 2021.2, see release notes:

Saving on Storage

Stream compression – is now on by default for all globals-based stream classes, with no application change required. Existing data remains readable and will be compressed upon the next write. Experiments with real-world data have indicated compression ratios ranging from 30% for short texts to 80% and more for XML and other document types.

Please check the relevant documentation:

Executing Stored Procedures

I've asked the DC AI chat bot and the answer is worth a look:

https://community.intersystems.com/ask-dc-ai?chat_id=1920

Note that using SQL Server ODBC you probably do not need to specify "IOType" in the param array.

If you still have problems, get back with a sample code of what you are doing.

Never, ever, concatenate parameters to an SQL Query!

Fixed for you:

    Set sqlQuery = "SELECT * FROM %Dictionary.PropertyDefinition WHERE parent = ? ORDER BY SequenceNumber"
    Set resultSet = ##class(%SQL.Statement).%New()
    Set status = resultSet.%Prepare(sqlQuery)
    $$$ThrowOnError(status)
    Set tResult = resultSet.%Execute(className)
    
    While tResult.%Next() {
        Set Name = tResult.%Get("Name")
        ...
        }

Back to your initial question, what is your definition of "sorted by Storage"?

If you need the ($list) position of properties within the global, then your query does not answer your question.
I'm writing this in case other community members read this question/answer.

	Set json=##class(%DynamicAbstractObject).%FromJSONFile("c:\temp\scott.json")
	Set itemIter=json.items.%GetIterator()
	While itemIter.%GetNext(.key, .item) {
		Set identifiersIter=item.identifiers.%GetIterator()
		While identifiersIter.%GetNext(.key, .identifier) {
			If (identifier.typeDiscriminator="ClassifiedId") && (identifier.type.term."en_US"="Scopus Author ID") {
				Write "pureId: ",identifier.pureId,!
				Write "uri: ",identifier.type.uri,!
				
			}
		}
	}

Output:

pureId: xxxxxxxx
uri: /dk/atira/pure/person/personsources/scopusauthor

P.S.: please note that, as posted, the json sample you provide is invalid.

%System/%System/RoutineChange

A process generates a %System/%System/RoutineChange event because a routine has been compiled or deleted. When enabled, this event causes a record to be written to the audit log whenever a routine or class is compiled. The Description field of the audit record includes the database directory where the modification took place, what routine or class was modified, and the word “Deleted” if the routine was deleted.

This Audit Event is available in IRIS, I have no idea if was available back in 2018.

Yes, pretty sure, that is what is taught in the ISC training courses and what the documentation says:

Description ($PROPERTY)
Property names are case-sensitive

Selecting Fields
Field names in a SELECT statement are not case-sensitive. SqlFieldName names and property names are case-sensitive.

Rules for Class Member Names
Note that the system preserves the case that you use when you define classes, and you must exactly match the case as given in the class definition. However, two class members cannot have names that differ only in case. For example, the identifiers id1 and ID1 are considered identical for purposes of (uniqueness.)