To solve Tom's problem, we can set up a linear programming model. Let's define two variables: $x$ for the number of slow shots and $y$ for the number of quick shots.

The objective function is to maximize the total score, which is given by $3x + 6y$, since each slow shot is worth 3 points and each quick shot is worth 6 points.

We have several constraints:

1. The total number of shots cannot exceed 20: $x + y \leq 20$.
2. Tom must take at least 8 slow shots: $x \geq 8$.
3. Tom must take at least 5 quick shots: $y \geq 5$.
4. Due to time restrictions, Tom can take at most 12 slow shots: $x \leq 12$.
5. Similarly, he can take at most 12 quick shots: $y \leq 12$.

All variables are non-negative since the number of shots cannot be negative.

Here's how we translate this into Gurobi code in Python:

```python
from gurobipy import *

# Create a new model
m = Model("Tom_Shots")

# Define the variables
x = m.addVar(lb=8, ub=12, vtype=GRB.INTEGER, name="slow_shots")
y = m.addVar(lb=5, ub=12, vtype=GRB.INTEGER, name="quick_shots")

# Objective function: Maximize the total score
m.setObjective(3*x + 6*y, GRB.MAXIMIZE)

# Constraint: Total shots cannot exceed 20
m.addConstr(x + y <= 20, "total_shots_constraint")

# Optimize the model
m.optimize()

# Print out the results if an optimal solution is found
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of slow shots: {x.x}")
    print(f"Number of quick shots: {y.x}")
    print(f"Maximum score: {m.objVal}")
else:
    print("No optimal solution found")
```