# [Python](https://www.python.org), 133 bytes
```python
k=lambda s:[s.replace("?",y)for y in"AZ"]
f=lambda p,q:-(p==q)*("?"not in p)or all(o:=[a<b for a in k(p)for b in k(q)])or any(o)and 9
```
[Attempt This Online!](https://ato.pxeger.com/run?1=bVTNbptAED70xlNMVpYMFY6CpUoNKlkR_4RIri25Vq3YtSyMFxWZAAas1kL2rU_RSy7tM7V9ms6y4J8YDuzMfN98M-zO8vN3tE2_hsHLy69N6jbe__2xMnz7ebG0IdGnyXXMIt92mEwoUbeKG8awBS8g5oTMJLdkRupab8iRYayVt5wZhCmSIFKQbvu-HOrG1P6wAJ5uc2QlR7nWQjhrZZZTg60cKnawhFvRzL83f1qD_ufOcNQZggFZ1_YTpgNpEhVG8YabGpq3uO5xbWhoGGQnSY6dsAQzCCGtQbujAn9D4w4MqfC50ywcq9PrDXhAKwJmv32KPwx6XQGPrScVxpY5EnBNhZpQrfGkp5H12H8QTKoC5dZesihFZ4xvKqC8XFG1MloG91z2QKC5zmmVvdQdDDu4PR9xUeHgfCoyqtE-Fc1Xo0P6WplWoJaJnZ7Z5VeYZ8gR4vuAzuTUnhQ59Aw5QnvJpC3Kz8M074sTwwj6k1Z-QBqeryRFsRekMgkDBhdP-i28DLLvEXNStgSIWbLxU4BwkzrhM6NEkfhY8vHhk5mP0XUS-R7qfwmIoks8n1cycrDEVKJMb2bHy1LDCGqVHVyStVnpNURqksZeJCuVEtjvK4m7QkIk5aQ4H3hXxuZUXvQQnXvB3LGDMPAc25-v2BZph1s1RcIsZ4pddEmGAnrzJtlBhiqFhR3oGhrlk2FlGVMV_Z2IZvV7s31VB8-tLHll8G9geHuhHq7qO6KIC17-df4D)
Returns `True` for left, `False` for right, `9` for undetermined, `-1` for equal.
Explanation (not that it's really necessary):
```python
k=lambda s: # ┑k(): Given a string, return:
[ # └─ in a list,
s.replace("?",y) # the result of replacing all '?'s with:
for y in"AZ"] # 'A', then 'Z'.
# ~ ~ ~ ~
f=lambda p,q: # ┑f(): Given two words, return:
-(p==q)*("?"not in p) # ├─ `-1` if identical and without '?'s.
or # │ Otherwise:
all( # │
o:=[a<b # │ ╭ First, compare left < right ╮
for a in k(p)for b in k(q)] # │ ╰ for each combination in k(1st)×k(2nd) ╯
) # ├─ `True` if all inequalities hold.
or # │ Otherwise:
any(o)and 9 # ├─ `9` if any of the above inequalities holds.
# └─ (`False` if all 'or's are exhausted).
```