## Step 1: Define the symbolic representation of the problem
First, let's define the symbolic variables and the objective function based on the given problem description.

## Step 2: Identify the symbolic variables
The variables are 'lightbulbs', 'rubber gloves', and 'paper towel rolls', which we can denote as $x_0$, $x_1$, and $x_2$ respectively.

## Step 3: Formulate the objective function
The objective function to maximize is $3x_0 + 8x_1 + 9x_2$.

## Step 4: List the constraints
The constraints given are:
1. $-5x_0 + 4x_2 \geq 0$
2. $6.34x_1 + 7.49x_2 \leq 27$
3. $4.47x_0 + 6.34x_1 \leq 37$
4. $4.47x_0 + 6.34x_1 + 7.49x_2 \leq 51$
5. $0.66x_0 + 6.28x_2 \leq 80$
6. $0.66x_0 + 3.04x_1 \leq 48$
7. $0.66x_0 + 3.04x_1 + 6.28x_2 \leq 74$
8. $x_0$ is an integer
9. $x_1$ is an integer
10. $x_2$ is an integer

## 5: Provide the symbolic representation in JSON format
```json
{
    'sym_variables': [('x0', 'lightbulbs'), ('x1', 'rubber gloves'), ('x2', 'paper towel rolls')],
    'objective_function': '3*x0 + 8*x1 + 9*x2',
    'constraints': [
        '-5*x0 + 4*x2 >= 0',
        '6.34*x1 + 7.49*x2 <= 27',
        '4.47*x0 + 6.34*x1 <= 37',
        '4.47*x0 + 6.34*x1 + 7.49*x2 <= 51',
        '0.66*x0 + 6.28*x2 <= 80',
        '0.66*x0 + 3.04*x1 <= 48',
        '0.66*x0 + 3.04*x1 + 6.28*x2 <= 74'
    ]
}
```

## 6: Implement the optimization problem using Gurobi
```python
import gurobi

# Define the model
model = gurobi.Model()

# Define the variables
lightbulbs = model.addVar(name='lightbulbs', vtype=gurobi.GRB.INTEGER)
rubber_gloves = model.addVar(name='rubber gloves', vtype=gurobi.GRB.INTEGER)
paper_towel_rolls = model.addVar(name='paper towel rolls', vtype=gurobi.GRB.INTEGER)

# Define the objective function
model.setObjective(3 * lightbulbs + 8 * rubber_gloves + 9 * paper_towel_rolls, gurobi.GRB.MAXIMIZE)

# Add constraints
model.addConstr(-5 * lightbulbs + 4 * paper_towel_rolls >= 0)
model.addConstr(6.34 * rubber_gloves + 7.49 * paper_towel_rolls <= 27)
model.addConstr(4.47 * lightbulbs + 6.34 * rubber_gloves <= 37)
model.addConstr(4.47 * lightbulbs + 6.34 * rubber_gloves + 7.49 * paper_towel_rolls <= 51)
model.addConstr(0.66 * lightbulbs + 6.28 * paper_towel_rolls <= 80)
model.addConstr(0.66 * lightbulbs + 3.04 * rubber_gloves <= 48)
model.addConstr(0.66 * lightbulbs + 3.04 * rubber_gloves + 6.28 * paper_towel_rolls <= 74)

# Optimize the model
model.optimize()

# Print the solution
if model.status == gurobi.GRB.OPTIMAL:
    print('Objective: ', model.objVal)
    print('Lightbulbs: ', lightbulbs.varValue)
    print('Rubber Gloves: ', rubber_gloves.varValue)
    print('Paper Towel Rolls: ', paper_towel_rolls.varValue)
else:
    print('The model is infeasible')
```