To solve the given optimization problem, we first need to translate the natural language description into a mathematical formulation. The goal is to maximize revenue while not exceeding the available space, labor hours, or budget.

Let's denote:
- \(x_h\) as the square feet allocated for headset production.
- \(x_k\) as the square feet allocated for keyboard production.

The objective function (to maximize revenue) can be written as:
\[ \text{Maximize:} \quad 45x_h + 80x_k \]

Given constraints are:
1. **Space constraint**: The total space used cannot exceed 120 sq. feet.
   \[ x_h + x_k \leq 120 \]
2. **Labor constraint**: The total labor hours used cannot exceed 2500 hours.
   Given that headsets require 2.5 hours of labor per sq. foot and keyboards require 3.5 hours of labor per sq. foot, we have:
   \[ 2.5x_h + 3.5x_k \leq 2500 \]
3. **Budget constraint**: The total cost (for electricity and equipment) cannot exceed $5500.
   Given that headsets cost $10 per sq. foot and keyboards cost $12 per sq. foot, we have:
   \[ 10x_h + 12x_k \leq 5500 \]
4. **Non-negativity constraints**: The space allocated for each product cannot be negative.
   \[ x_h \geq 0, \quad x_k \geq 0 \]

Now, let's translate this mathematical formulation into Gurobi code in Python:

```python
from gurobipy import *

# Create a model
m = Model("Factory_Optimization")

# Define variables
x_h = m.addVar(lb=0, name="headset_space")
x_k = m.addVar(lb=0, name="keyboard_space")

# Set the objective function
m.setObjective(45*x_h + 80*x_k, GRB.MAXIMIZE)

# Add constraints
m.addConstr(x_h + x_k <= 120, "space_constraint")
m.addConstr(2.5*x_h + 3.5*x_k <= 2500, "labor_constraint")
m.addConstr(10*x_h + 12*x_k <= 5500, "budget_constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Headset space: {x_h.x}")
    print(f"Keyboard space: {x_k.x}")
    print(f"Maximum revenue: {m.objVal}")
else:
    print("No optimal solution found")

```