This question is similar to Which is preferable and why: onchange or template.querySelector, in that there are several different ways to do the same thing in LWC but it's not always clear as to which is the best practice way.
When using a wire call, one can then get the value of a field like this (both approaches could be encapsulated in a getter):
@wire(getRecord, {
recordId: "$recordId",
fields: [CLOSE_DATE]
})
opportunity;
and then in the .js file:
let closeDate = this.opportunity.data.fields.CloseDate.value;
or:
let closeDate = getFieldValue(
this.opportunity.data,
CLOSE_DATE
);
It seems that Salesforce aren't strictly advising one way or the other but it seems that the latter is more 'standard' and less prone to breaking (I suppose if one has a custom field and the API changed, then it would need to be changed in multiple places whereas it would just have to be changed once using getFieldValue).