To solve this problem, we need to define the decision variables, the objective function, and the constraints. 

Let's denote:
- $x_e$ as the number of hours the Eastside bakery is run.
- $x_w$ as the number of hours the Westside bakery is run.

The objective function aims to minimize the total cost of running both bakeries. Given that the Eastside bakery costs $300 per hour and the Westside bakery costs $500 per hour, the objective function can be written as:
\[ \text{Minimize} \quad 300x_e + 500x_w \]

The constraints are based on the production requirements:
- At least 800 everything bagels: \(100x_e + 50x_w \geq 800\)
- At least 600 blueberry bagels: \(80x_e + 60x_w \geq 600\)
- At least 1000 regular bagels: \(30x_e + 100x_w \geq 1000\)

Additionally, since we cannot run a bakery for a negative number of hours, we have:
- \(x_e \geq 0\)
- \(x_w \geq 0\)

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

```python
from gurobipy import *

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

# Define the decision variables
x_e = m.addVar(lb=0, name="Eastside_Bakery_Hours")
x_w = m.addVar(lb=0, name="Westside_Bakery_Hours")

# Define the objective function
m.setObjective(300*x_e + 500*x_w, GRB.MINIMIZE)

# Define the constraints
m.addConstr(100*x_e + 50*x_w >= 800, name="Everything_Bagels_Constraint")
m.addConstr(80*x_e + 60*x_w >= 600, name="Blueberry_Bagels_Constraint")
m.addConstr(30*x_e + 100*x_w >= 1000, name="Regular_Bagels_Constraint")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Eastside Bakery Hours: {x_e.x}")
    print(f"Westside Bakery Hours: {x_w.x}")
    print(f"Total Cost: ${300*x_e.x + 500*x_w.x:.2f}")
else:
    print("No optimal solution found.")
```