To solve this optimization problem, we first need to translate the given conditions into mathematical expressions. Let's denote:

- \(R\) as the number of researchers.
- \(D\) as the number of developers.

The constraints based on the problem description are:

1. The total number of workers must be at least 50: \(R + D \geq 50\).
2. At least 30 workers must be developers: \(D \geq 30\).
3. The number of researchers must be at least a third of the number of developers: \(R \geq \frac{1}{3}D\).
4. The total weekly payroll must not exceed $250,000: \(2500R + 1500D \leq 250,000\).

The objective is to minimize the total wages paid, which can be represented as: Minimize \(2500R + 1500D\).

Given these constraints and the objective function, we can formulate this problem in Gurobi using Python. Here's how you could write the model:

```python
from gurobipy import *

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

# Define variables
R = m.addVar(vtype=GRB.CONTINUOUS, name="Researchers")
D = m.addVar(vtype=GRB.CONTINUOUS, name="Developers")

# Set objective function: Minimize total wages
m.setObjective(2500*R + 1500*D, GRB.MINIMIZE)

# Add constraints
m.addConstr(R + D >= 50, "Total_workers")
m.addConstr(D >= 30, "Minimum_developers")
m.addConstr(R >= (1/3)*D, "Researchers_vs_Developers")
m.addConstr(2500*R + 1500*D <= 250000, "Payroll_limit")

# Optimize model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Number of Researchers: {R.x}")
    print(f"Number of Developers: {D.x}")
    print(f"Total wages: ${2500*R.x + 1500*D.x:.2f}")
else:
    print("No optimal solution found")
```