To solve this optimization problem, we first need to define the decision variables, objective function, and constraints based on the given information.

Let's denote:
- $H$ as the number of houses cleaned.
- $A$ as the number of apartments cleaned.

The profit per house is $300, and the profit per apartment is $250. Thus, the total profit can be represented by the objective function:
\[ \text{Maximize:} \quad 300H + 250A \]

Given that each house requires 2 hours of sweeping and each apartment requires 1 hour of sweeping, with a total of 600 hours available for sweeping, we have the constraint:
\[ 2H + A \leq 600 \]

For mopping, since each house requires 2 hours and each apartment requires 1.5 hours, with a total of 700 hours available, we get:
\[ 2H + 1.5A \leq 700 \]

Additionally, $H$ and $A$ must be non-negative (since you cannot clean a negative number of houses or apartments), so we have:
\[ H \geq 0 \]
\[ A \geq 0 \]

And since the problem involves cleaning whole units, ideally $H$ and $A$ should be integers.

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

```python
from gurobipy import *

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

# Define decision variables
H = m.addVar(vtype=GRB.INTEGER, name="houses")
A = m.addVar(vtype=GRB.INTEGER, name="apartments")

# Objective function: Maximize profit
m.setObjective(300*H + 250*A, GRB.MAXIMIZE)

# Constraints
m.addConstr(2*H + A <= 600, "sweeping_time")
m.addConstr(2*H + 1.5*A <= 700, "mopping_time")

# Solve the model
m.optimize()

# Print results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Houses: {H.x}")
    print(f"Apartments: {A.x}")
    print(f"Maximum Profit: ${300*H.x + 250*A.x}")
else:
    print("No optimal solution found")

```