To solve the given optimization problem using Gurobi, we first need to define the variables and the objective function. The variables are 'hours worked by Bobby' (let's call this $x_0$) and 'hours worked by Bill' (let's call this $x_1$). The objective is to maximize $8x_0 + 5x_1$.

Given constraints:
- Work quality rating for Bobby: $7x_0$
- Organization score for Bobby: $21x_0$
- Work quality rating for Bill: $27x_1$
- Organization score for Bill: $26x_1$
- Combined work quality rating $\geq 49$: $7x_0 + 27x_1 \geq 49$
- Combined organization score $\geq 50$: $21x_0 + 26x_1 \geq 50$
- Linear constraint: $-4x_0 + 3x_1 \geq 0$
- Combined work quality rating $\leq 93$: $7x_0 + 27x_1 \leq 93$
- Combined organization score $\leq 115$: $21x_0 + 26x_1 \leq 115$

Since the problem involves both continuous and integer variables, we will use Gurobi's mixed-integer linear programming (MILP) capabilities.

```python
from gurobipy import *

# Create a new model
m = Model("Work Hours Optimization")

# Define variables: hours worked by Bobby can be non-integer, but hours worked by Bill must be integer
x0 = m.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.CONTINUOUS, name="hours_worked_by_Bobby")
x1 = m.addVar(lb=0, ub=GRB.INFINITY, vtype=GRB.INTEGER, name="hours_worked_by_Bill")

# Objective function: maximize 8*x0 + 5*x1
m.setObjective(8*x0 + 5*x1, GRB.MAXIMIZE)

# Constraints
m.addConstr(7*x0 + 27*x1 >= 49, name="combined_work_quality_rating_min")
m.addConstr(21*x0 + 26*x1 >= 50, name="combined_organization_score_min")
m.addConstr(-4*x0 + 3*x1 >= 0, name="linear_constraint")
m.addConstr(7*x0 + 27*x1 <= 93, name="combined_work_quality_rating_max")
m.addConstr(21*x0 + 26*x1 <= 115, name="combined_organization_score_max")

# Optimize the model
m.optimize()

# Print solution
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hours worked by Bobby: {x0.x}")
    print(f"Hours worked by Bill: {x1.x}")
    print(f"Objective function value: {m.objVal}")
else:
    print("No optimal solution found")
```